package juego;

import java.util.ArrayList;

public abstract class Proyectil extends Automata {

	//atributos de clase
	protected static int miRapidez = 10;
	protected static int miTamanio = 1;

	//atributos de instancia
	protected boolean esLeal;

	//metodos

	//constructor. llama al constructor de Automata
	public Proyectil(Coordenada ubicacion) {
		super(ubicacion);
		esLeal = false;//esLeal es false por defecto.
	};


	//pre: recibe como parametros las listas de moviles y de botines.
	//post: actualiza las listas y retorna los puntos que deban computarse
	@Override
	public int vivir(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		//movimiento
		this.movimientoPropio();
		//impacto
		int puntaje = this.impactar(listaDeMoviles,listaDeBotines);
		return puntaje;
	};


	//metodo privado que se encarga de modificar la ubicacion.
	//redefinicion del metodo de Automata
	@Override
	protected void movimientoPropio() {
		int movimiento = miRapidez;
		//si es leal se mueve para arriba
		if (esLeal){
			movimiento = movimiento * -1;
		};
		this.ubicacion.moverEnY(movimiento);
	};

	public void hacerLeal(){
		this.esLeal = true;
	};

	//redefinicion del metodo de Movil
	@Override
	public boolean verLealtad(){
		return this.esLeal;
	};


	//redefinicion del metodo de Movil
	@Override
	public boolean esProyectil(){
		return true;
	};

	@Override
	public boolean esNaveEnemiga(){
		return false;
	};

	public int verTamanio(){
		return miTamanio;
	};

	public int velocidad(){
		return miRapidez;
	};

	//siempre que recibe un impacto es destruido. 
	@Override
	public int recibirImpacto(Impacto impacto, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		this.vivo = false;
		int puntaje = this.verificarDestruccion(listaDeMoviles, listaDeBotines);
		return puntaje;
	};

//	//Retorna el puntaje acumulado por la destruccion de otros moviles.
//	//Este metodo se encarga de llamar al metodo destruirse.
//	@Override
//	protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
//		int puntaje = 0;
//		boolean destruido = false;
//		Iterator<Movil> iterador = listaDeMoviles.iterator();
//		boolean contacto;
//
//		while (iterador.hasNext()){
//
//			Movil movil = iterador.next();
//			try {
//				contacto = movil.huboContacto(this);
//				boolean enemigo = (this.esLeal != movil.verLealtad());
//
//				if (contacto & enemigo & !movil.esProyectil()){
//					puntaje += movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
//
//					//si no esta vivo lo elimina de la lista
//					if (!movil.estaVivo()){
//						iterador.remove();
//					};
//					destruido = true;
//				}
//			}
//			catch (Exception e){}
//		}
//
//		if (destruido){
//			this.destruirse(listaDeMoviles);
//		}
//		return puntaje;
//	};
	
	//resuelve el choque. retorna el puntaje
	protected int impactoPropio(Movil movil, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		boolean lealtadPropia = this.esLeal;
		boolean lealtadOtroMovil = movil.verLealtad();
		int puntaje = 0;
		//solo puede impactar moviles enemigos
		if (lealtadPropia != lealtadOtroMovil){
			//no puede impactar proyectiles
			if(!movil.esProyectil()){
				//movil mata a this
				this.vivo = false;
				//movil recibe el impacto. se elimina de la lista si corresponde. se modifica el puntaje
				puntaje += movil.recibirImpacto(this.impactoProvocado(),listaDeMoviles, listaDeBotines);
			}
		}
		return puntaje;
	}
	
	//se encarga de destruirse si corresponde.retorna 0
	protected int verificarDestruccion(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		if(this.vivo){
			return 0;
		}
		//si no esta vivo se destruye y retorna 0
		this.destruirse(listaDeMoviles);
		return 0;
	}
			
	

    
}




